<html><meta charset="utf-8"><meta http-equiv="X-WebKit-CSP" content="object-src 'none'; script-src 'none' 'unsafe-eval'"><body><table>http://localhost:8888/jquery.json.js<hr><pre>HTTP/1.1 200 OK
Content-Type: application/x-javascript
Content-Length: 12139
Last-Modified: Sat, 05 Nov 2011 15:17:24 GMT
Cache-Control: private
Server: Jetty(6.1.x)
</pre><hr><pre>00000000:  d2  00  00  00  02  00  00  00  d1  17  79  2f  95  0f  2e  00  ..........y/....
00000010:  99  4a  79  2f  95  0f  2e  00  a7  00  00  00  48  54  54  50  .Jy/........HTTP
00000020:  2f  31  2e  31  20  32  30  30  20  4f  4b  00  43  6f  6e  74  /1.1 200 OK.Cont
00000030:  65  6e  74  2d  54  79  70  65  3a  20  61  70  70  6c  69  63  ent-Type: applic
00000040:  61  74  69  6f  6e  2f  78  2d  6a  61  76  61  73  63  72  69  ation/x-javascri
00000050:  70  74  00  43  6f  6e  74  65  6e  74  2d  4c  65  6e  67  74  pt.Content-Lengt
00000060:  68  3a  20  31  32  31  33  39  00  4c  61  73  74  2d  4d  6f  h: 12139.Last-Mo
00000070:  64  69  66  69  65  64  3a  20  53  61  74  2c  20  30  35  20  dified: Sat, 05 
00000080:  4e  6f  76  20  32  30  31  31  20  31  35  3a  31  37  3a  32  Nov 2011 15:17:2
00000090:  34  20  47  4d  54  00  43  61  63  68  65  2d  43  6f  6e  74  4 GMT.Cache-Cont
000000a0:  72  6f  6c  3a  20  70  72  69  76  61  74  65  00  53  65  72  rol: private.Ser
000000b0:  76  65  72  3a  20  4a  65  74  74  79  28  36  2e  31  2e  78  ver: Jetty(6.1.x
000000c0:  29  00  00  00  09  00  00  00  31  32  37  2e  30  2e  30  2e  ).......127.0.0.
000000d0:  31  00  00  00  b8  22                                          1....&quot;
</pre><hr><pre>00000000:  3b  28  66  75  6e  63  74  69  6f  6e  28  24  29  20  7b  0a  ;(function($) {.
00000010:  20  20  20  20  69  66  20  28  21  74  68  69  73  2e  4a  53      if (!this.JS
00000020:  4f  4e  29  20  7b  0a  20  20  20  20  20  20  20  20  74  68  ON) {.        th
00000030:  69  73  2e  4a  53  4f  4e  20  3d  20  7b  7d  3b  0a  20  20  is.JSON = {};.  
00000040:  20  20  7d  0a  20  20  20  20  28  66  75  6e  63  74  69  6f    }.    (functio
00000050:  6e  20  28  29  20  7b  0a  0a  20  20  20  20  20  20  20  20  n () {..        
00000060:  66  75  6e  63  74  69  6f  6e  20  66  28  6e  29  20  7b  0a  function f(n) {.
00000070:  20  20  20  20  20  20  20  20  20  20  20  20  2f  2f  20  46              // F
00000080:  6f  72  6d  61  74  20  69  6e  74  65  67  65  72  73  20  74  ormat integers t
00000090:  6f  20  68  61  76  65  20  61  74  20  6c  65  61  73  74  20  o have at least 
000000a0:  74  77  6f  20  64  69  67  69  74  73  2e  0a  20  20  20  20  two digits..    
000000b0:  20  20  20  20  20  20  20  20  72  65  74  75  72  6e  20  6e          return n
000000c0:  20  3c  20  31  30  20  3f  20  27  30  27  20  2b  20  6e  20   &lt; 10 ? &#39;0&#39; + n 
000000d0:  3a  20  6e  3b  0a  20  20  20  20  20  20  20  20  7d  0a  0a  : n;.        }..
000000e0:  20  20  20  20  20  20  20  20  69  66  20  28  74  79  70  65          if (type
000000f0:  6f  66  20  44  61  74  65  2e  70  72  6f  74  6f  74  79  70  of Date.prototyp
00000100:  65  2e  74  6f  4a  53  4f  4e  20  21  3d  3d  20  27  66  75  e.toJSON !== &#39;fu
00000110:  6e  63  74  69  6f  6e  27  29  20  7b  0a  0a  20  20  20  20  nction&#39;) {..    
00000120:  20  20  20  20  20  20  20  20  44  61  74  65  2e  70  72  6f          Date.pro
00000130:  74  6f  74  79  70  65  2e  74  6f  4a  53  4f  4e  20  3d  20  totype.toJSON = 
00000140:  66  75  6e  63  74  69  6f  6e  20  28  6b  65  79  29  20  7b  function (key) {
00000150:  0a  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  ..              
00000160:  20  20  72  65  74  75  72  6e  20  74  68  69  73  2e  67  65    return this.ge
00000170:  74  55  54  43  46  75  6c  6c  59  65  61  72  28  29  20  20  tUTCFullYear()  
00000180:  20  2b  20  27  2d  27  20  2b  0a  20  20  20  20  20  20  20   + &#39;-&#39; +.       
00000190:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  66  28                f(
000001a0:  74  68  69  73  2e  67  65  74  55  54  43  4d  6f  6e  74  68  this.getUTCMonth
000001b0:  28  29  20  2b  20  31  29  20  2b  20  27  2d  27  20  2b  0a  () + 1) + &#39;-&#39; +.
000001c0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000001d0:  20  20  20  20  20  66  28  74  68  69  73  2e  67  65  74  55       f(this.getU
000001e0:  54  43  44  61  74  65  28  29  29  20  20  20  20  20  20  2b  TCDate())      +
000001f0:  20  27  54  27  20  2b  0a  20  20  20  20  20  20  20  20  20   &#39;T&#39; +.         
00000200:  20  20  20  20  20  20  20  20  20  20  20  20  66  28  74  68              f(th
00000210:  69  73  2e  67  65  74  55  54  43  48  6f  75  72  73  28  29  is.getUTCHours()
00000220:  29  20  20  20  20  20  2b  20  27  3a  27  20  2b  0a  20  20  )     + &#39;:&#39; +.  
00000230:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00000240:  20  20  20  66  28  74  68  69  73  2e  67  65  74  55  54  43     f(this.getUTC
00000250:  4d  69  6e  75  74  65  73  28  29  29  20  20  20  2b  20  27  Minutes())   + &#39;
00000260:  3a  27  20  2b  0a  20  20  20  20  20  20  20  20  20  20  20  :&#39; +.           
00000270:  20  20  20  20  20  20  20  20  20  20  66  28  74  68  69  73            f(this
00000280:  2e  67  65  74  55  54  43  53  65  63  6f  6e  64  73  28  29  .getUTCSeconds()
00000290:  29  20  20  20  2b  20  27  5a  27  3b  0a  20  20  20  20  20  )   + &#39;Z&#39;;.     
000002a0:  20  20  20  20  20  20  20  7d  3b  0a  0a  20  20  20  20  20         };..     
000002b0:  20  20  20  20  20  20  20  53  74  72  69  6e  67  2e  70  72         String.pr
000002c0:  6f  74  6f  74  79  70  65  2e  74  6f  4a  53  4f  4e  20  3d  ototype.toJSON =
000002d0:  0a  20  20  20  20  20  20  20  20  20  20  20  20  4e  75  6d  .            Num
000002e0:  62  65  72  2e  70  72  6f  74  6f  74  79  70  65  2e  74  6f  ber.prototype.to
000002f0:  4a  53  4f  4e  20  3d  0a  20  20  20  20  20  20  20  20  20  JSON =.         
00000300:  20  20  20  42  6f  6f  6c  65  61  6e  2e  70  72  6f  74  6f     Boolean.proto
00000310:  74  79  70  65  2e  74  6f  4a  53  4f  4e  20  3d  20  66  75  type.toJSON = fu
00000320:  6e  63  74  69  6f  6e  20  28  6b  65  79  29  20  7b  0a  20  nction (key) {. 
00000330:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  72                 r
00000340:  65  74  75  72  6e  20  74  68  69  73  2e  76  61  6c  75  65  eturn this.value
00000350:  4f  66  28  29  3b  0a  20  20  20  20  20  20  20  20  20  20  Of();.          
00000360:  20  20  7d  3b  0a  20  20  20  20  20  20  20  20  7d  0a  0a    };.        }..
00000370:  20  20  20  20  20  20  20  20  76  61  72  20  63  78  20  3d          var cx =
00000380:  20  2f  5b  5c  75  30  30  30  30  5c  75  30  30  61  64  5c   /[\u0000\u00ad\
00000390:  75  30  36  30  30  2d  5c  75  30  36  30  34  5c  75  30  37  u0600-\u0604\u07
000003a0:  30  66  5c  75  31  37  62  34  5c  75  31  37  62  35  5c  75  0f\u17b4\u17b5\u
000003b0:  32  30  30  63  2d  5c  75  32  30  30  66  5c  75  32  30  32  200c-\u200f\u202
000003c0:  38  2d  5c  75  32  30  32  66  5c  75  32  30  36  30  2d  5c  8-\u202f\u2060-\
000003d0:  75  32  30  36  66  5c  75  66  65  66  66  5c  75  66  66  66  u206f\ufeff\ufff
000003e0:  30  2d  5c  75  66  66  66  66  5d  2f  67  2c  0a  20  20  20  0-\uffff]/g,.   
000003f0:  20  20  20  20  20  20  20  20  20  65  73  63  61  70  61  62           escapab
00000400:  6c  65  20  3d  20  2f  5b  5c  5c  5c  22  5c  78  30  30  2d  le = /[\\\&quot;\x00-
00000410:  5c  78  31  66  5c  78  37  66  2d  5c  78  39  66  5c  75  30  \x1f\x7f-\x9f\u0
00000420:  30  61  64  5c  75  30  36  30  30  2d  5c  75  30  36  30  34  0ad\u0600-\u0604
00000430:  5c  75  30  37  30  66  5c  75  31  37  62  34  5c  75  31  37  \u070f\u17b4\u17
00000440:  62  35  5c  75  32  30  30  63  2d  5c  75  32  30  30  66  5c  b5\u200c-\u200f\
00000450:  75  32  30  32  38  2d  5c  75  32  30  32  66  5c  75  32  30  u2028-\u202f\u20
00000460:  36  30  2d  5c  75  32  30  36  66  5c  75  66  65  66  66  5c  60-\u206f\ufeff\
00000470:  75  66  66  66  30  2d  5c  75  66  66  66  66  5d  2f  67  2c  ufff0-\uffff]/g,
00000480:  0a  20  20  20  20  20  20  20  20  20  20  20  20  67  61  70  .            gap
00000490:  2c  0a  20  20  20  20  20  20  20  20  20  20  20  20  69  6e  ,.            in
000004a0:  64  65  6e  74  2c  0a  20  20  20  20  20  20  20  20  20  20  dent,.          
000004b0:  20  20  6d  65  74  61  20  3d  20  7b  20  20  20  20  2f  2f    meta = {    //
000004c0:  20  74  61  62  6c  65  20  6f  66  20  63  68  61  72  61  63   table of charac
000004d0:  74  65  72  20  73  75  62  73  74  69  74  75  74  69  6f  6e  ter substitution
000004e0:  73  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  s.              
000004f0:  20  20  27  5c  62  27  3a  20  27  5c  5c  62  27  2c  0a  20    &#39;\b&#39;: &#39;\\b&#39;,. 
00000500:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  27                 &#39;
00000510:  5c  74  27  3a  20  27  5c  5c  74  27  2c  0a  20  20  20  20  \t&#39;: &#39;\\t&#39;,.    
00000520:  20  20  20  20  20  20  20  20  20  20  20  20  27  5c  6e  27              &#39;\n&#39;
00000530:  3a  20  27  5c  5c  6e  27  2c  0a  20  20  20  20  20  20  20  : &#39;\\n&#39;,.       
00000540:  20  20  20  20  20  20  20  20  20  27  5c  66  27  3a  20  27           &#39;\f&#39;: &#39;
00000550:  5c  5c  66  27  2c  0a  20  20  20  20  20  20  20  20  20  20  \\f&#39;,.          
00000560:  20  20  20  20  20  20  27  5c  72  27  3a  20  27  5c  5c  72        &#39;\r&#39;: &#39;\\r
00000570:  27  2c  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  &#39;,.             
00000580:  20  20  20  27  22  27  20  3a  20  27  5c  5c  22  27  2c  0a     &#39;&quot;&#39; : &#39;\\&quot;&#39;,.
00000590:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000005a0:  27  5c  5c  27  3a  20  27  5c  5c  5c  5c  27  0a  20  20  20  &#39;\\&#39;: &#39;\\\\&#39;.   
000005b0:  20  20  20  20  20  20  20  20  20  7d  2c  0a  20  20  20  20           },.    
000005c0:  20  20  20  20  20  20  20  20  72  65  70  3b  0a  0a  0a  20          rep;... 
000005d0:  20  20  20  20  20  20  20  66  75  6e  63  74  69  6f  6e  20         function 
000005e0:  71  75  6f  74  65  28  73  74  72  69  6e  67  29  20  7b  0a  quote(string) {.
000005f0:  0a  20  20  20  20  2f  2f  20  49  66  20  74  68  65  20  73  .    // If the s
00000600:  74  72  69  6e  67  20  63  6f  6e  74  61  69  6e  73  20  6e  tring contains n
00000610:  6f  20  63  6f  6e  74  72  6f  6c  20  63  68  61  72  61  63  o control charac
00000620:  74  65  72  73  2c  20  6e  6f  20  71  75  6f  74  65  20  63  ters, no quote c
00000630:  68  61  72  61  63  74  65  72  73  2c  20  61  6e  64  20  6e  haracters, and n
00000640:  6f  0a  20  20  20  20  2f  2f  20  62  61  63  6b  73  6c  61  o.    // backsla
00000650:  73  68  20  63  68  61  72  61  63  74  65  72  73  2c  20  74  sh characters, t
00000660:  68  65  6e  20  77  65  20  63  61  6e  20  73  61  66  65  6c  hen we can safel
00000670:  79  20  73  6c  61  70  20  73  6f  6d  65  20  71  75  6f  74  y slap some quot
00000680:  65  73  20  61  72  6f  75  6e  64  20  69  74  2e  0a  20  20  es around it..  
00000690:  20  20  2f  2f  20  4f  74  68  65  72  77  69  73  65  20  77    // Otherwise w
000006a0:  65  20  6d  75  73  74  20  61  6c  73  6f  20  72  65  70  6c  e must also repl
000006b0:  61  63  65  20  74  68  65  20  6f  66  66  65  6e  64  69  6e  ace the offendin
000006c0:  67  20  63  68  61  72  61  63  74  65  72  73  20  77  69  74  g characters wit
000006d0:  68  20  73  61  66  65  20  65  73  63  61  70  65  0a  20  20  h safe escape.  
000006e0:  20  20  2f  2f  20  73  65  71  75  65  6e  63  65  73  2e  0a    // sequences..
000006f0:  0a  20  20  20  20  20  20  20  20  20  20  20  20  65  73  63  .            esc
00000700:  61  70  61  62  6c  65  2e  6c  61  73  74  49  6e  64  65  78  apable.lastIndex
00000710:  20  3d  20  30  3b  0a  20  20  20  20  20  20  20  20  20  20   = 0;.          
00000720:  20  20  72  65  74  75  72  6e  20  65  73  63  61  70  61  62    return escapab
00000730:  6c  65  2e  74  65  73  74  28  73  74  72  69  6e  67  29  20  le.test(string) 
00000740:  3f  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  ?.              
00000750:  20  20  27  22  27  20  2b  20  73  74  72  69  6e  67  2e  72    &#39;&quot;&#39; + string.r
00000760:  65  70  6c  61  63  65  28  65  73  63  61  70  61  62  6c  65  eplace(escapable
00000770:  2c  20  66  75  6e  63  74  69  6f  6e  20  28  61  29  20  7b  , function (a) {
00000780:  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  .               
00000790:  20  20  20  20  20  76  61  72  20  63  20  3d  20  6d  65  74       var c = met
000007a0:  61  5b  61  5d  3b  0a  20  20  20  20  20  20  20  20  20  20  a[a];.          
000007b0:  20  20  20  20  20  20  20  20  20  20  72  65  74  75  72  6e            return
000007c0:  20  74  79  70  65  6f  66  20  63  20  3d  3d  3d  20  27  73   typeof c === &#39;s
000007d0:  74  72  69  6e  67  27  20  3f  20  63  20  3a  0a  20  20  20  tring&#39; ? c :.   
000007e0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000007f0:  20  20  20  20  20  27  5c  5c  75  27  20  2b  20  28  27  30       &#39;\\u&#39; + (&#39;0
00000800:  30  30  30  27  20  2b  20  61  2e  63  68  61  72  43  6f  64  000&#39; + a.charCod
00000810:  65  41  74  28  30  29  2e  74  6f  53  74  72  69  6e  67  28  eAt(0).toString(
00000820:  31  36  29  29  2e  73  6c  69  63  65  28  2d  34  29  3b  0a  16)).slice(-4);.
00000830:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00000840:  7d  29  20  2b  20  27  22  27  20  3a  0a  20  20  20  20  20  }) + &#39;&quot;&#39; :.     
00000850:  20  20  20  20  20  20  20  20  20  20  20  27  22  27  20  2b             &#39;&quot;&#39; +
00000860:  20  73  74  72  69  6e  67  20  2b  20  27  22  27  3b  0a  20   string + &#39;&quot;&#39;;. 
00000870:  20  20  20  20  20  20  20  7d  0a  0a  0a  20  20  20  20  20         }...     
00000880:  20  20  20  66  75  6e  63  74  69  6f  6e  20  73  74  72  28     function str(
00000890:  6b  65  79  2c  20  68  6f  6c  64  65  72  29  20  7b  0a  0a  key, holder) {..
000008a0:  20  20  20  20  2f  2f  20  50  72  6f  64  75  63  65  20  61      // Produce a
000008b0:  20  73  74  72  69  6e  67  20  66  72  6f  6d  20  68  6f  6c   string from hol
000008c0:  64  65  72  5b  6b  65  79  5d  2e  0a  0a  20  20  20  20  20  der[key]...     
000008d0:  20  20  20  20  20  20  20  76  61  72  20  69  2c  20  20  20         var i,   
000008e0:  20  20  20  20  20  20  20  2f  2f  20  54  68  65  20  6c  6f         // The lo
000008f0:  6f  70  20  63  6f  75  6e  74  65  72  2e  0a  20  20  20  20  op counter..    
00000900:  20  20  20  20  20  20  20  20  20  20  20  20  6b  2c  20  20              k,  
00000910:  20  20  20  20  20  20  20  20  2f  2f  20  54  68  65  20  6d          // The m
00000920:  65  6d  62  65  72  20  6b  65  79  2e  0a  20  20  20  20  20  ember key..     
00000930:  20  20  20  20  20  20  20  20  20  20  20  76  2c  20  20  20             v,   
00000940:  20  20  20  20  20  20  20  2f  2f  20  54  68  65  20  6d  65         // The me
00000950:  6d  62  65  72  20  76  61  6c  75  65  2e  0a  20  20  20  20  mber value..    
00000960:  20  20  20  20  20  20  20  20  20  20  20  20  6c  65  6e  67              leng
00000970:  74  68  2c  0a  20  20  20  20  20  20  20  20  20  20  20  20  th,.            
00000980:  20  20  20  20  6d  69  6e  64  20  3d  20  67  61  70  2c  0a      mind = gap,.
00000990:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000009a0:  70  61  72  74  69  61  6c  2c  0a  20  20  20  20  20  20  20  partial,.       
000009b0:  20  20  20  20  20  20  20  20  20  76  61  6c  75  65  20  3d           value =
000009c0:  20  68  6f  6c  64  65  72  5b  6b  65  79  5d  3b  0a  0a  20   holder[key];.. 
000009d0:  20  20  20  2f  2f  20  49  66  20  74  68  65  20  76  61  6c     // If the val
000009e0:  75  65  20  68  61  73  20  61  20  74  6f  4a  53  4f  4e  20  ue has a toJSON 
000009f0:  6d  65  74  68  6f  64  2c  20  63  61  6c  6c  20  69  74  20  method, call it 
00000a00:  74  6f  20  6f  62  74  61  69  6e  20  61  20  72  65  70  6c  to obtain a repl
00000a10:  61  63  65  6d  65  6e  74  20  76  61  6c  75  65  2e  0a  0a  acement value...
00000a20:  20  20  20  20  20  20  20  20  20  20  20  20  69  66  20  28              if (
00000a30:  76  61  6c  75  65  20  26  26  20  74  79  70  65  6f  66  20  value &amp;&amp; typeof 
00000a40:  76  61  6c  75  65  20  3d  3d  3d  20  27  6f  62  6a  65  63  value === &#39;objec
00000a50:  74  27  20  26  26  0a  20  20  20  20  20  20  20  20  20  20  t&#39; &amp;&amp;.          
00000a60:  20  20  20  20  20  20  20  20  20  20  74  79  70  65  6f  66            typeof
00000a70:  20  76  61  6c  75  65  2e  74  6f  4a  53  4f  4e  20  3d  3d   value.toJSON ==
00000a80:  3d  20  27  66  75  6e  63  74  69  6f  6e  27  29  20  7b  0a  = &#39;function&#39;) {.
00000a90:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00000aa0:  76  61  6c  75  65  20  3d  20  76  61  6c  75  65  2e  74  6f  value = value.to
00000ab0:  4a  53  4f  4e  28  6b  65  79  29  3b  0a  20  20  20  20  20  JSON(key);.     
00000ac0:  20  20  20  20  20  20  20  7d  0a  0a  20  20  20  20  2f  2f         }..    //
00000ad0:  20  49  66  20  77  65  20  77  65  72  65  20  63  61  6c  6c   If we were call
00000ae0:  65  64  20  77  69  74  68  20  61  20  72  65  70  6c  61  63  ed with a replac
00000af0:  65  72  20  66  75  6e  63  74  69  6f  6e  2c  20  74  68  65  er function, the
00000b00:  6e  20  63  61  6c  6c  20  74  68  65  20  72  65  70  6c  61  n call the repla
00000b10:  63  65  72  20  74  6f  0a  20  20  20  20  2f  2f  20  6f  62  cer to.    // ob
00000b20:  74  61  69  6e  20  61  20  72  65  70  6c  61  63  65  6d  65  tain a replaceme
00000b30:  6e  74  20  76  61  6c  75  65  2e  0a  0a  20  20  20  20  20  nt value...     
00000b40:  20  20  20  20  20  20  20  69  66  20  28  74  79  70  65  6f         if (typeo
00000b50:  66  20  72  65  70  20  3d  3d  3d  20  27  66  75  6e  63  74  f rep === &#39;funct
00000b60:  69  6f  6e  27  29  20  7b  0a  20  20  20  20  20  20  20  20  ion&#39;) {.        
00000b70:  20  20  20  20  20  20  20  20  76  61  6c  75  65  20  3d  20          value = 
00000b80:  72  65  70  2e  63  61  6c  6c  28  68  6f  6c  64  65  72  2c  rep.call(holder,
00000b90:  20  6b  65  79  2c  20  76  61  6c  75  65  29  3b  0a  20  20   key, value);.  
00000ba0:  20  20  20  20  20  20  20  20  20  20  7d  0a  0a  20  20  20            }..   
00000bb0:  20  2f  2f  20  57  68  61  74  20  68  61  70  70  65  6e  73   // What happens
00000bc0:  20  6e  65  78  74  20  64  65  70  65  6e  64  73  20  6f  6e   next depends on
00000bd0:  20  74  68  65  20  76  61  6c  75  65  27  73  20  74  79  70   the value&#39;s typ
00000be0:  65  2e  0a  0a  20  20  20  20  20  20  20  20  20  20  20  20  e...            
00000bf0:  73  77  69  74  63  68  20  28  74  79  70  65  6f  66  20  76  switch (typeof v
00000c00:  61  6c  75  65  29  20  7b  0a  20  20  20  20  20  20  20  20  alue) {.        
00000c10:  20  20  20  20  63  61  73  65  20  27  73  74  72  69  6e  67      case &#39;string
00000c20:  27  3a  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  &#39;:.             
00000c30:  20  20  20  72  65  74  75  72  6e  20  71  75  6f  74  65  28     return quote(
00000c40:  76  61  6c  75  65  29  3b  0a  0a  20  20  20  20  20  20  20  value);..       
00000c50:  20  20  20  20  20  63  61  73  65  20  27  6e  75  6d  62  65       case &#39;numbe
00000c60:  72  27  3a  0a  0a  20  20  20  20  2f  2f  20  4a  53  4f  4e  r&#39;:..    // JSON
00000c70:  20  6e  75  6d  62  65  72  73  20  6d  75  73  74  20  62  65   numbers must be
00000c80:  20  66  69  6e  69  74  65  2e  20  45  6e  63  6f  64  65  20   finite. Encode 
00000c90:  6e  6f  6e  2d  66  69  6e  69  74  65  20  6e  75  6d  62  65  non-finite numbe
00000ca0:  72  73  20  61  73  20  6e  75  6c  6c  2e  0a  0a  20  20  20  rs as null...   
00000cb0:  20  20  20  20  20  20  20  20  20  20  20  20  20  72  65  74               ret
00000cc0:  75  72  6e  20  69  73  46  69  6e  69  74  65  28  76  61  6c  urn isFinite(val
00000cd0:  75  65  29  20  3f  20  53  74  72  69  6e  67  28  76  61  6c  ue) ? String(val
00000ce0:  75  65  29  20  3a  20  27  6e  75  6c  6c  27  3b  0a  0a  20  ue) : &#39;null&#39;;.. 
00000cf0:  20  20  20  20  20  20  20  20  20  20  20  63  61  73  65  20             case 
00000d00:  27  62  6f  6f  6c  65  61  6e  27  3a  0a  20  20  20  20  20  &#39;boolean&#39;:.     
00000d10:  20  20  20  20  20  20  20  63  61  73  65  20  27  6e  75  6c         case &#39;nul
00000d20:  6c  27  3a  0a  0a  20  20  20  20  2f  2f  20  49  66  20  74  l&#39;:..    // If t
00000d30:  68  65  20  76  61  6c  75  65  20  69  73  20  61  20  62  6f  he value is a bo
00000d40:  6f  6c  65  61  6e  20  6f  72  20  6e  75  6c  6c  2c  20  63  olean or null, c
00000d50:  6f  6e  76  65  72  74  20  69  74  20  74  6f  20  61  20  73  onvert it to a s
00000d60:  74  72  69  6e  67  2e  20  4e  6f  74  65  3a  0a  20  20  20  tring. Note:.   
00000d70:  20  2f  2f  20  74  79  70  65  6f  66  20  6e  75  6c  6c  20   // typeof null 
00000d80:  64  6f  65  73  20  6e  6f  74  20  70  72  6f  64  75  63  65  does not produce
00000d90:  20  27  6e  75  6c  6c  27  2e  20  54  68  65  20  63  61  73   &#39;null&#39;. The cas
00000da0:  65  20  69  73  20  69  6e  63  6c  75  64  65  64  20  68  65  e is included he
00000db0:  72  65  20  69  6e  0a  20  20  20  20  2f  2f  20  74  68  65  re in.    // the
00000dc0:  20  72  65  6d  6f  74  65  20  63  68  61  6e  63  65  20  74   remote chance t
00000dd0:  68  61  74  20  74  68  69  73  20  67  65  74  73  20  66  69  hat this gets fi
00000de0:  78  65  64  20  73  6f  6d  65  64  61  79  2e  0a  0a  20  20  xed someday...  
00000df0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  72  65                re
00000e00:  74  75  72  6e  20  53  74  72  69  6e  67  28  76  61  6c  75  turn String(valu
00000e10:  65  29  3b  0a  0a  20  20  20  20  2f  2f  20  49  66  20  74  e);..    // If t
00000e20:  68  65  20  74  79  70  65  20  69  73  20  27  6f  62  6a  65  he type is &#39;obje
00000e30:  63  74  27  2c  20  77  65  20  6d  69  67  68  74  20  62  65  ct&#39;, we might be
00000e40:  20  64  65  61  6c  69  6e  67  20  77  69  74  68  20  61  6e   dealing with an
00000e50:  20  6f  62  6a  65  63  74  20  6f  72  20  61  6e  20  61  72   object or an ar
00000e60:  72  61  79  20  6f  72  0a  20  20  20  20  2f  2f  20  6e  75  ray or.    // nu
00000e70:  6c  6c  2e  0a  0a  20  20  20  20  20  20  20  20  20  20  20  ll...           
00000e80:  20  63  61  73  65  20  27  6f  62  6a  65  63  74  27  3a  0a   case &#39;object&#39;:.
00000e90:  0a  20  20  20  20  2f  2f  20  44  75  65  20  74  6f  20  61  .    // Due to a
00000ea0:  20  73  70  65  63  69  66  69  63  61  74  69  6f  6e  20  62   specification b
00000eb0:  6c  75  6e  64  65  72  20  69  6e  20  45  43  4d  41  53  63  lunder in ECMASc
00000ec0:  72  69  70  74  2c  20  74  79  70  65  6f  66  20  6e  75  6c  ript, typeof nul
00000ed0:  6c  20  69  73  20  27  6f  62  6a  65  63  74  27  2c  0a  20  l is &#39;object&#39;,. 
00000ee0:  20  20  20  2f  2f  20  73  6f  20  77  61  74  63  68  20  6f     // so watch o
00000ef0:  75  74  20  66  6f  72  20  74  68  61  74  20  63  61  73  65  ut for that case
00000f00:  2e  0a  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  ...             
00000f10:  20  20  20  69  66  20  28  21  76  61  6c  75  65  29  20  7b     if (!value) {
00000f20:  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  .               
00000f30:  20  20  20  20  20  72  65  74  75  72  6e  20  27  6e  75  6c       return &#39;nul
00000f40:  6c  27  3b  0a  20  20  20  20  20  20  20  20  20  20  20  20  l&#39;;.            
00000f50:  20  20  20  20  7d  0a  0a  20  20  20  20  2f  2f  20  4d  61      }..    // Ma
00000f60:  6b  65  20  61  6e  20  61  72  72  61  79  20  74  6f  20  68  ke an array to h
00000f70:  6f  6c  64  20  74  68  65  20  70  61  72  74  69  61  6c  20  old the partial 
00000f80:  72  65  73  75  6c  74  73  20  6f  66  20  73  74  72  69  6e  results of strin
00000f90:  67  69  66  79  69  6e  67  20  74  68  69  73  20  6f  62  6a  gifying this obj
00000fa0:  65  63  74  20  76  61  6c  75  65  2e  0a  0a  20  20  20  20  ect value...    
00000fb0:  20  20  20  20  20  20  20  20  20  20  20  20  67  61  70  20              gap 
00000fc0:  2b  3d  20  69  6e  64  65  6e  74  3b  0a  20  20  20  20  20  += indent;.     
00000fd0:  20  20  20  20  20  20  20  20  20  20  20  70  61  72  74  69             parti
00000fe0:  61  6c  20  3d  20  5b  5d  3b  0a  0a  20  20  20  20  2f  2f  al = [];..    //
00000ff0:  20  49  73  20  74  68  65  20  76  61  6c  75  65  20  61  6e   Is the value an
00001000:  20  61  72  72  61  79  3f  0a  0a  20  20  20  20  20  20  20   array?..       
00001010:  20  20  20  20  20  20  20  20  20  69  66  20  28  4f  62  6a           if (Obj
00001020:  65  63  74  2e  70  72  6f  74  6f  74  79  70  65  2e  74  6f  ect.prototype.to
00001030:  53  74  72  69  6e  67  2e  61  70  70  6c  79  28  76  61  6c  String.apply(val
00001040:  75  65  29  20  3d  3d  3d  20  27  5b  6f  62  6a  65  63  74  ue) === &#39;[object
00001050:  20  41  72  72  61  79  5d  27  29  20  7b  0a  0a  20  20  20   Array]&#39;) {..   
00001060:  20  2f  2f  20  54  68  65  20  76  61  6c  75  65  20  69  73   // The value is
00001070:  20  61  6e  20  61  72  72  61  79  2e  20  53  74  72  69  6e   an array. Strin
00001080:  67  69  66  79  20  65  76  65  72  79  20  65  6c  65  6d  65  gify every eleme
00001090:  6e  74  2e  20  55  73  65  20  6e  75  6c  6c  20  61  73  20  nt. Use null as 
000010a0:  61  20  70  6c  61  63  65  68  6f  6c  64  65  72  0a  20  20  a placeholder.  
000010b0:  20  20  2f  2f  20  66  6f  72  20  6e  6f  6e  2d  4a  53  4f    // for non-JSO
000010c0:  4e  20  76  61  6c  75  65  73  2e  0a  0a  20  20  20  20  20  N values...     
000010d0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  6c                 l
000010e0:  65  6e  67  74  68  20  3d  20  76  61  6c  75  65  2e  6c  65  ength = value.le
000010f0:  6e  67  74  68  3b  0a  20  20  20  20  20  20  20  20  20  20  ngth;.          
00001100:  20  20  20  20  20  20  20  20  20  20  66  6f  72  20  28  69            for (i
00001110:  20  3d  20  30  3b  20  69  20  3c  20  6c  65  6e  67  74  68   = 0; i &lt; length
00001120:  3b  20  69  20  2b  3d  20  31  29  20  7b  0a  20  20  20  20  ; i += 1) {.    
00001130:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001140:  20  20  20  20  70  61  72  74  69  61  6c  5b  69  5d  20  3d      partial[i] =
00001150:  20  73  74  72  28  69  2c  20  76  61  6c  75  65  29  20  7c   str(i, value) |
00001160:  7c  20  27  6e  75  6c  6c  27  3b  0a  20  20  20  20  20  20  | &#39;null&#39;;.      
00001170:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  7d  0a                }.
00001180:  0a  20  20  20  20  2f  2f  20  4a  6f  69  6e  20  61  6c  6c  .    // Join all
00001190:  20  6f  66  20  74  68  65  20  65  6c  65  6d  65  6e  74  73   of the elements
000011a0:  20  74  6f  67  65  74  68  65  72  2c  20  73  65  70  61  72   together, separ
000011b0:  61  74  65  64  20  77  69  74  68  20  63  6f  6d  6d  61  73  ated with commas
000011c0:  2c  20  61  6e  64  20  77  72  61  70  20  74  68  65  6d  20  , and wrap them 
000011d0:  69  6e  0a  20  20  20  20  2f  2f  20  62  72  61  63  6b  65  in.    // bracke
000011e0:  74  73  2e  0a  0a  20  20  20  20  20  20  20  20  20  20  20  ts...           
000011f0:  20  20  20  20  20  20  20  20  20  76  20  3d  20  70  61  72           v = par
00001200:  74  69  61  6c  2e  6c  65  6e  67  74  68  20  3d  3d  3d  20  tial.length === 
00001210:  30  20  3f  20  27  5b  5d  27  20  3a  0a  20  20  20  20  20  0 ? &#39;[]&#39; :.     
00001220:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001230:  20  20  20  67  61  70  20  3f  20  27  5b  5c  6e  27  20  2b     gap ? &#39;[\n&#39; +
00001240:  20  67  61  70  20  2b  0a  20  20  20  20  20  20  20  20  20   gap +.         
00001250:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001260:  20  20  20  20  20  20  20  70  61  72  74  69  61  6c  2e  6a         partial.j
00001270:  6f  69  6e  28  27  2c  5c  6e  27  20  2b  20  67  61  70  29  oin(&#39;,\n&#39; + gap)
00001280:  20  2b  20  27  5c  6e  27  20  2b  0a  20  20  20  20  20  20   + &#39;\n&#39; +.      
00001290:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000012a0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  6d  69                mi
000012b0:  6e  64  20  2b  20  27  5d  27  20  3a  0a  20  20  20  20  20  nd + &#39;]&#39; :.     
000012c0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000012d0:  20  20  20  20  20  20  20  20  20  27  5b  27  20  2b  20  70           &#39;[&#39; + p
000012e0:  61  72  74  69  61  6c  2e  6a  6f  69  6e  28  27  2c  27  29  artial.join(&#39;,&#39;)
000012f0:  20  2b  20  27  5d  27  3b  0a  20  20  20  20  20  20  20  20   + &#39;]&#39;;.        
00001300:  20  20  20  20  20  20  20  20  20  20  20  20  67  61  70  20              gap 
00001310:  3d  20  6d  69  6e  64  3b  0a  20  20  20  20  20  20  20  20  = mind;.        
00001320:  20  20  20  20  20  20  20  20  20  20  20  20  72  65  74  75              retu
00001330:  72  6e  20  76  3b  0a  20  20  20  20  20  20  20  20  20  20  rn v;.          
00001340:  20  20  20  20  20  20  7d  0a  0a  20  20  20  20  2f  2f  20        }..    // 
00001350:  49  66  20  74  68  65  20  72  65  70  6c  61  63  65  72  20  If the replacer 
00001360:  69  73  20  61  6e  20  61  72  72  61  79  2c  20  75  73  65  is an array, use
00001370:  20  69  74  20  74  6f  20  73  65  6c  65  63  74  20  74  68   it to select th
00001380:  65  20  6d  65  6d  62  65  72  73  20  74  6f  20  62  65  20  e members to be 
00001390:  73  74  72  69  6e  67  69  66  69  65  64  2e  0a  0a  20  20  stringified...  
000013a0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  69  66                if
000013b0:  20  28  72  65  70  20  26  26  20  74  79  70  65  6f  66  20   (rep &amp;&amp; typeof 
000013c0:  72  65  70  20  3d  3d  3d  20  27  6f  62  6a  65  63  74  27  rep === &#39;object&#39;
000013d0:  29  20  7b  0a  20  20  20  20  20  20  20  20  20  20  20  20  ) {.            
000013e0:  20  20  20  20  20  20  20  20  6c  65  6e  67  74  68  20  3d          length =
000013f0:  20  72  65  70  2e  6c  65  6e  67  74  68  3b  0a  20  20  20   rep.length;.   
00001400:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001410:  20  66  6f  72  20  28  69  20  3d  20  30  3b  20  69  20  3c   for (i = 0; i &lt;
00001420:  20  6c  65  6e  67  74  68  3b  20  69  20  2b  3d  20  31  29   length; i += 1)
00001430:  20  7b  0a  20  20  20  20  20  20  20  20  20  20  20  20  20   {.             
00001440:  20  20  20  20  20  20  20  20  20  20  20  6b  20  3d  20  72             k = r
00001450:  65  70  5b  69  5d  3b  0a  20  20  20  20  20  20  20  20  20  ep[i];.         
00001460:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  69                 i
00001470:  66  20  28  74  79  70  65  6f  66  20  6b  20  3d  3d  3d  20  f (typeof k === 
00001480:  27  73  74  72  69  6e  67  27  29  20  7b  0a  20  20  20  20  &#39;string&#39;) {.    
00001490:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000014a0:  20  20  20  20  20  20  20  20  76  20  3d  20  73  74  72  28          v = str(
000014b0:  6b  2c  20  76  61  6c  75  65  29  3b  0a  20  20  20  20  20  k, value);.     
000014c0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000014d0:  20  20  20  20  20  20  20  69  66  20  28  76  29  20  7b  0a         if (v) {.
000014e0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000014f0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001500:  70  61  72  74  69  61  6c  2e  70  75  73  68  28  71  75  6f  partial.push(quo
00001510:  74  65  28  6b  29  20  2b  20  28  67  61  70  20  3f  20  27  te(k) + (gap ? &#39;
00001520:  3a  20  27  20  3a  20  27  3a  27  29  20  2b  20  76  29  3b  : &#39; : &#39;:&#39;) + v);
00001530:  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  .               
00001540:  20  20  20  20  20  20  20  20  20  20  20  20  20  7d  0a  20               }. 
00001550:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001560:  20  20  20  20  20  20  20  7d  0a  20  20  20  20  20  20  20         }.       
00001570:  20  20  20  20  20  20  20  20  20  20  20  20  20  7d  0a  20               }. 
00001580:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  7d                 }
00001590:  20  65  6c  73  65  20  7b  0a  0a  20  20  20  20  2f  2f  20   else {..    // 
000015a0:  4f  74  68  65  72  77  69  73  65  2c  20  69  74  65  72  61  Otherwise, itera
000015b0:  74  65  20  74  68  72  6f  75  67  68  20  61  6c  6c  20  6f  te through all o
000015c0:  66  20  74  68  65  20  6b  65  79  73  20  69  6e  20  74  68  f the keys in th
000015d0:  65  20  6f  62  6a  65  63  74  2e  0a  0a  20  20  20  20  20  e object...     
000015e0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  66                 f
000015f0:  6f  72  20  28  6b  20  69  6e  20  76  61  6c  75  65  29  20  or (k in value) 
00001600:  7b  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  {.              
00001610:  20  20  20  20  20  20  20  20  20  20  69  66  20  28  4f  62            if (Ob
00001620:  6a  65  63  74  2e  68  61  73  4f  77  6e  50  72  6f  70  65  ject.hasOwnPrope
00001630:  72  74  79  2e  63  61  6c  6c  28  76  61  6c  75  65  2c  20  rty.call(value, 
00001640:  6b  29  29  20  7b  0a  20  20  20  20  20  20  20  20  20  20  k)) {.          
00001650:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001660:  20  20  76  20  3d  20  73  74  72  28  6b  2c  20  76  61  6c    v = str(k, val
00001670:  75  65  29  3b  0a  20  20  20  20  20  20  20  20  20  20  20  ue);.           
00001680:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001690:  20  69  66  20  28  76  29  20  7b  0a  20  20  20  20  20  20   if (v) {.      
000016a0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000016b0:  20  20  20  20  20  20  20  20  20  20  70  61  72  74  69  61            partia
000016c0:  6c  2e  70  75  73  68  28  71  75  6f  74  65  28  6b  29  20  l.push(quote(k) 
000016d0:  2b  20  28  67  61  70  20  3f  20  27  3a  20  27  20  3a  20  + (gap ? &#39;: &#39; : 
000016e0:  27  3a  27  29  20  2b  20  76  29  3b  0a  20  20  20  20  20  &#39;:&#39;) + v);.     
000016f0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001700:  20  20  20  20  20  20  20  7d  0a  20  20  20  20  20  20  20         }.       
00001710:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001720:  20  7d  0a  20  20  20  20  20  20  20  20  20  20  20  20  20   }.             
00001730:  20  20  20  20  20  20  20  7d  0a  20  20  20  20  20  20  20         }.       
00001740:  20  20  20  20  20  20  20  20  20  7d  0a  0a  20  20  20  20           }..    
00001750:  2f  2f  20  4a  6f  69  6e  20  61  6c  6c  20  6f  66  20  74  // Join all of t
00001760:  68  65  20  6d  65  6d  62  65  72  20  74  65  78  74  73  20  he member texts 
00001770:  74  6f  67  65  74  68  65  72  2c  20  73  65  70  61  72  61  together, separa
00001780:  74  65  64  20  77  69  74  68  20  63  6f  6d  6d  61  73  2c  ted with commas,
00001790:  0a  20  20  20  20  2f  2f  20  61  6e  64  20  77  72  61  70  .    // and wrap
000017a0:  20  74  68  65  6d  20  69  6e  20  62  72  61  63  65  73  2e   them in braces.
000017b0:  0a  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  ..              
000017c0:  20  20  76  20  3d  20  70  61  72  74  69  61  6c  2e  6c  65    v = partial.le
000017d0:  6e  67  74  68  20  3d  3d  3d  20  30  20  3f  20  27  7b  7d  ngth === 0 ? &#39;{}
000017e0:  27  20  3a  0a  20  20  20  20  20  20  20  20  20  20  20  20  &#39; :.            
000017f0:  20  20  20  20  20  20  20  20  67  61  70  20  3f  20  27  7b          gap ? &#39;{
00001800:  5c  6e  27  20  2b  20  67  61  70  20  2b  20  70  61  72  74  \n&#39; + gap + part
00001810:  69  61  6c  2e  6a  6f  69  6e  28  27  2c  5c  6e  27  20  2b  ial.join(&#39;,\n&#39; +
00001820:  20  67  61  70  29  20  2b  20  27  5c  6e  27  20  2b  0a  20   gap) + &#39;\n&#39; +. 
00001830:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001840:  20  20  20  20  20  20  20  20  20  20  20  6d  69  6e  64  20             mind 
00001850:  2b  20  27  7d  27  20  3a  20  27  7b  27  20  2b  20  70  61  + &#39;}&#39; : &#39;{&#39; + pa
00001860:  72  74  69  61  6c  2e  6a  6f  69  6e  28  27  2c  27  29  20  rtial.join(&#39;,&#39;) 
00001870:  2b  20  27  7d  27  3b  0a  20  20  20  20  20  20  20  20  20  + &#39;}&#39;;.         
00001880:  20  20  20  20  20  20  20  67  61  70  20  3d  20  6d  69  6e         gap = min
00001890:  64  3b  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  d;.             
000018a0:  20  20  20  72  65  74  75  72  6e  20  76  3b  0a  20  20  20     return v;.   
000018b0:  20  20  20  20  20  20  20  20  20  7d  0a  20  20  20  20  20           }.     
000018c0:  20  20  20  7d  0a  0a  20  20  20  20  2f  2f  20  49  66  20     }..    // If 
000018d0:  74  68  65  20  4a  53  4f  4e  20  6f  62  6a  65  63  74  20  the JSON object 
000018e0:  64  6f  65  73  20  6e  6f  74  20  79  65  74  20  68  61  76  does not yet hav
000018f0:  65  20  61  20  73  74  72  69  6e  67  69  66  79  20  6d  65  e a stringify me
00001900:  74  68  6f  64  2c  20  67  69  76  65  20  69  74  20  6f  6e  thod, give it on
00001910:  65  2e  0a  0a  20  20  20  20  20  20  20  20  69  66  20  28  e...        if (
00001920:  74  79  70  65  6f  66  20  4a  53  4f  4e  2e  73  74  72  69  typeof JSON.stri
00001930:  6e  67  69  66  79  20  21  3d  3d  20  27  66  75  6e  63  74  ngify !== &#39;funct
00001940:  69  6f  6e  27  29  20  7b  0a  20  20  20  20  20  20  20  20  ion&#39;) {.        
00001950:  20  20  20  20  4a  53  4f  4e  2e  73  74  72  69  6e  67  69      JSON.stringi
00001960:  66  79  20  3d  20  66  75  6e  63  74  69  6f  6e  20  28  76  fy = function (v
00001970:  61  6c  75  65  2c  20  72  65  70  6c  61  63  65  72  2c  20  alue, replacer, 
00001980:  73  70  61  63  65  29  20  7b  0a  0a  20  20  20  20  2f  2f  space) {..    //
00001990:  20  54  68  65  20  73  74  72  69  6e  67  69  66  79  20  6d   The stringify m
000019a0:  65  74  68  6f  64  20  74  61  6b  65  73  20  61  20  76  61  ethod takes a va
000019b0:  6c  75  65  20  61  6e  64  20  61  6e  20  6f  70  74  69  6f  lue and an optio
000019c0:  6e  61  6c  20  72  65  70  6c  61  63  65  72  2c  20  61  6e  nal replacer, an
000019d0:  64  20  61  6e  20  6f  70  74  69  6f  6e  61  6c  0a  20  20  d an optional.  
000019e0:  20  20  2f  2f  20  73  70  61  63  65  20  70  61  72  61  6d    // space param
000019f0:  65  74  65  72  2c  20  61  6e  64  20  72  65  74  75  72  6e  eter, and return
00001a00:  73  20  61  20  4a  53  4f  4e  20  74  65  78  74  2e  20  54  s a JSON text. T
00001a10:  68  65  20  72  65  70  6c  61  63  65  72  20  63  61  6e  20  he replacer can 
00001a20:  62  65  20  61  20  66  75  6e  63  74  69  6f  6e  0a  20  20  be a function.  
00001a30:  20  20  2f  2f  20  74  68  61  74  20  63  61  6e  20  72  65    // that can re
00001a40:  70  6c  61  63  65  20  76  61  6c  75  65  73  2c  20  6f  72  place values, or
00001a50:  20  61  6e  20  61  72  72  61  79  20  6f  66  20  73  74  72   an array of str
00001a60:  69  6e  67  73  20  74  68  61  74  20  77  69  6c  6c  20  73  ings that will s
00001a70:  65  6c  65  63  74  20  74  68  65  20  6b  65  79  73  2e  0a  elect the keys..
00001a80:  20  20  20  20  2f  2f  20  41  20  64  65  66  61  75  6c  74      // A default
00001a90:  20  72  65  70  6c  61  63  65  72  20  6d  65  74  68  6f  64   replacer method
00001aa0:  20  63  61  6e  20  62  65  20  70  72  6f  76  69  64  65  64   can be provided
00001ab0:  2e  20  55  73  65  20  6f  66  20  74  68  65  20  73  70  61  . Use of the spa
00001ac0:  63  65  20  70  61  72  61  6d  65  74  65  72  20  63  61  6e  ce parameter can
00001ad0:  0a  20  20  20  20  2f  2f  20  70  72  6f  64  75  63  65  20  .    // produce 
00001ae0:  74  65  78  74  20  74  68  61  74  20  69  73  20  6d  6f  72  text that is mor
00001af0:  65  20  65  61  73  69  6c  79  20  72  65  61  64  61  62  6c  e easily readabl
00001b00:  65  2e  0a  0a  20  20  20  20  20  20  20  20  20  20  20  20  e...            
00001b10:  20  20  20  20  76  61  72  20  69  3b  0a  20  20  20  20  20      var i;.     
00001b20:  20  20  20  20  20  20  20  20  20  20  20  67  61  70  20  3d             gap =
00001b30:  20  27  27  3b  0a  20  20  20  20  20  20  20  20  20  20  20   &#39;&#39;;.           
00001b40:  20  20  20  20  20  69  6e  64  65  6e  74  20  3d  20  27  27       indent = &#39;&#39;
00001b50:  3b  0a  0a  20  20  20  20  2f  2f  20  49  66  20  74  68  65  ;..    // If the
00001b60:  20  73  70  61  63  65  20  70  61  72  61  6d  65  74  65  72   space parameter
00001b70:  20  69  73  20  61  20  6e  75  6d  62  65  72  2c  20  6d  61   is a number, ma
00001b80:  6b  65  20  61  6e  20  69  6e  64  65  6e  74  20  73  74  72  ke an indent str
00001b90:  69  6e  67  20  63  6f  6e  74  61  69  6e  69  6e  67  20  74  ing containing t
00001ba0:  68  61  74  0a  20  20  20  20  2f  2f  20  6d  61  6e  79  20  hat.    // many 
00001bb0:  73  70  61  63  65  73  2e  0a  0a  20  20  20  20  20  20  20  spaces...       
00001bc0:  20  20  20  20  20  20  20  20  20  69  66  20  28  74  79  70           if (typ
00001bd0:  65  6f  66  20  73  70  61  63  65  20  3d  3d  3d  20  27  6e  eof space === &#39;n
00001be0:  75  6d  62  65  72  27  29  20  7b  0a  20  20  20  20  20  20  umber&#39;) {.      
00001bf0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  66  6f                fo
00001c00:  72  20  28  69  20  3d  20  30  3b  20  69  20  3c  20  73  70  r (i = 0; i &lt; sp
00001c10:  61  63  65  3b  20  69  20  2b  3d  20  31  29  20  7b  0a  20  ace; i += 1) {. 
00001c20:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001c30:  20  20  20  20  20  20  20  69  6e  64  65  6e  74  20  2b  3d         indent +=
00001c40:  20  27  20  27  3b  0a  20  20  20  20  20  20  20  20  20  20   &#39; &#39;;.          
00001c50:  20  20  20  20  20  20  20  20  20  20  7d  0a  0a  20  20  20            }..   
00001c60:  20  2f  2f  20  49  66  20  74  68  65  20  73  70  61  63  65   // If the space
00001c70:  20  70  61  72  61  6d  65  74  65  72  20  69  73  20  61  20   parameter is a 
00001c80:  73  74  72  69  6e  67  2c  20  69  74  20  77  69  6c  6c  20  string, it will 
00001c90:  62  65  20  75  73  65  64  20  61  73  20  74  68  65  20  69  be used as the i
00001ca0:  6e  64  65  6e  74  20  73  74  72  69  6e  67  2e  0a  0a  20  ndent string... 
00001cb0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  7d                 }
00001cc0:  20  65  6c  73  65  20  69  66  20  28  74  79  70  65  6f  66   else if (typeof
00001cd0:  20  73  70  61  63  65  20  3d  3d  3d  20  27  73  74  72  69   space === &#39;stri
00001ce0:  6e  67  27  29  20  7b  0a  20  20  20  20  20  20  20  20  20  ng&#39;) {.         
00001cf0:  20  20  20  20  20  20  20  20  20  20  20  69  6e  64  65  6e             inden
00001d00:  74  20  3d  20  73  70  61  63  65  3b  0a  20  20  20  20  20  t = space;.     
00001d10:  20  20  20  20  20  20  20  20  20  20  20  7d  0a  0a  20  20             }..  
00001d20:  20  20  2f  2f  20  49  66  20  74  68  65  72  65  20  69  73    // If there is
00001d30:  20  61  20  72  65  70  6c  61  63  65  72  2c  20  69  74  20   a replacer, it 
00001d40:  6d  75  73  74  20  62  65  20  61  20  66  75  6e  63  74  69  must be a functi
00001d50:  6f  6e  20  6f  72  20  61  6e  20  61  72  72  61  79  2e  0a  on or an array..
00001d60:  20  20  20  20  2f  2f  20  4f  74  68  65  72  77  69  73  65      // Otherwise
00001d70:  2c  20  74  68  72  6f  77  20  61  6e  20  65  72  72  6f  72  , throw an error
00001d80:  2e  0a  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  ...             
00001d90:  20  20  20  72  65  70  20  3d  20  72  65  70  6c  61  63  65     rep = replace
00001da0:  72  3b  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  r;.             
00001db0:  20  20  20  69  66  20  28  72  65  70  6c  61  63  65  72  20     if (replacer 
00001dc0:  26  26  20  74  79  70  65  6f  66  20  72  65  70  6c  61  63  &amp;&amp; typeof replac
00001dd0:  65  72  20  21  3d  3d  20  27  66  75  6e  63  74  69  6f  6e  er !== &#39;function
00001de0:  27  20  26  26  0a  20  20  20  20  20  20  20  20  20  20  20  &#39; &amp;&amp;.           
00001df0:  20  20  20  20  20  20  20  20  20  20  20  20  20  28  74  79               (ty
00001e00:  70  65  6f  66  20  72  65  70  6c  61  63  65  72  20  21  3d  peof replacer !=
00001e10:  3d  20  27  6f  62  6a  65  63  74  27  20  7c  7c  0a  20  20  = &#39;object&#39; ||.  
00001e20:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001e30:  20  20  20  20  20  20  20  74  79  70  65  6f  66  20  72  65         typeof re
00001e40:  70  6c  61  63  65  72  2e  6c  65  6e  67  74  68  20  21  3d  placer.length !=
00001e50:  3d  20  27  6e  75  6d  62  65  72  27  29  29  20  7b  0a  20  = &#39;number&#39;)) {. 
00001e60:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00001e70:  20  20  20  74  68  72  6f  77  20  6e  65  77  20  45  72  72     throw new Err
00001e80:  6f  72  28  27  4a  53  4f  4e  2e  73  74  72  69  6e  67  69  or(&#39;JSON.stringi
00001e90:  66  79  27  29  3b  0a  20  20  20  20  20  20  20  20  20  20  fy&#39;);.          
00001ea0:  20  20  20  20  20  20  7d  0a  0a  20  20  20  20  2f  2f  20        }..    // 
00001eb0:  4d  61  6b  65  20  61  20  66  61  6b  65  20  72  6f  6f  74  Make a fake root
00001ec0:  20  6f  62  6a  65  63  74  20  63  6f  6e  74  61  69  6e  69   object containi
00001ed0:  6e  67  20  6f  75  72  20  76  61  6c  75  65  20  75  6e  64  ng our value und
00001ee0:  65  72  20  74  68  65  20  6b  65  79  20  6f  66  20  27  27  er the key of &#39;&#39;
00001ef0:  2e  0a  20  20  20  20  2f  2f  20  52  65  74  75  72  6e  20  ..    // Return 
00001f00:  74  68  65  20  72  65  73  75  6c  74  20  6f  66  20  73  74  the result of st
00001f10:  72  69  6e  67  69  66  79  69  6e  67  20  74  68  65  20  76  ringifying the v
00001f20:  61  6c  75  65  2e  0a  0a  20  20  20  20  20  20  20  20  20  alue...         
00001f30:  20  20  20  20  20  20  20  72  65  74  75  72  6e  20  73  74         return st
00001f40:  72  28  27  27  2c  20  7b  27  27  3a  20  76  61  6c  75  65  r(&#39;&#39;, {&#39;&#39;: value
00001f50:  7d  29  3b  0a  20  20  20  20  20  20  20  20  20  20  20  20  });.            
00001f60:  7d  3b  0a  20  20  20  20  20  20  20  20  7d  0a  0a  0a  20  };.        }... 
00001f70:  20  20  20  2f  2f  20  49  66  20  74  68  65  20  4a  53  4f     // If the JSO
00001f80:  4e  20  6f  62  6a  65  63  74  20  64  6f  65  73  20  6e  6f  N object does no
00001f90:  74  20  79  65  74  20  68  61  76  65  20  61  20  70  61  72  t yet have a par
00001fa0:  73  65  20  6d  65  74  68  6f  64  2c  20  67  69  76  65  20  se method, give 
00001fb0:  69  74  20  6f  6e  65  2e  0a  0a  20  20  20  20  20  20  20  it one...       
00001fc0:  20  69  66  20  28  74  79  70  65  6f  66  20  4a  53  4f  4e   if (typeof JSON
00001fd0:  2e  70  61  72  73  65  20  21  3d  3d  20  27  66  75  6e  63  .parse !== &#39;func
00001fe0:  74  69  6f  6e  27  29  20  7b  0a  20  20  20  20  20  20  20  tion&#39;) {.       
00001ff0:  20  20  20  20  20  4a  53  4f  4e  2e  70  61  72  73  65  20       JSON.parse 
00002000:  3d  20  66  75  6e  63  74  69  6f  6e  20  28  74  65  78  74  = function (text
00002010:  2c  20  72  65  76  69  76  65  72  29  20  7b  0a  0a  20  20  , reviver) {..  
00002020:  20  20  2f  2f  20  54  68  65  20  70  61  72  73  65  20  6d    // The parse m
00002030:  65  74  68  6f  64  20  74  61  6b  65  73  20  61  20  74  65  ethod takes a te
00002040:  78  74  20  61  6e  64  20  61  6e  20  6f  70  74  69  6f  6e  xt and an option
00002050:  61  6c  20  72  65  76  69  76  65  72  20  66  75  6e  63  74  al reviver funct
00002060:  69  6f  6e  2c  20  61  6e  64  20  72  65  74  75  72  6e  73  ion, and returns
00002070:  0a  20  20  20  20  2f  2f  20  61  20  4a  61  76  61  53  63  .    // a JavaSc
00002080:  72  69  70  74  20  76  61  6c  75  65  20  69  66  20  74  68  ript value if th
00002090:  65  20  74  65  78  74  20  69  73  20  61  20  76  61  6c  69  e text is a vali
000020a0:  64  20  4a  53  4f  4e  20  74  65  78  74  2e  0a  0a  20  20  d JSON text...  
000020b0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  76  61                va
000020c0:  72  20  6a  3b  0a  0a  20  20  20  20  20  20  20  20  20  20  r j;..          
000020d0:  20  20  20  20  20  20  66  75  6e  63  74  69  6f  6e  20  77        function w
000020e0:  61  6c  6b  28  68  6f  6c  64  65  72  2c  20  6b  65  79  29  alk(holder, key)
000020f0:  20  7b  0a  0a  20  20  20  20  2f  2f  20  54  68  65  20  77   {..    // The w
00002100:  61  6c  6b  20  6d  65  74  68  6f  64  20  69  73  20  75  73  alk method is us
00002110:  65  64  20  74  6f  20  72  65  63  75  72  73  69  76  65  6c  ed to recursivel
00002120:  79  20  77  61  6c  6b  20  74  68  65  20  72  65  73  75  6c  y walk the resul
00002130:  74  69  6e  67  20  73  74  72  75  63  74  75  72  65  20  73  ting structure s
00002140:  6f  0a  20  20  20  20  2f  2f  20  74  68  61  74  20  6d  6f  o.    // that mo
00002150:  64  69  66  69  63  61  74  69  6f  6e  73  20  63  61  6e  20  difications can 
00002160:  62  65  20  6d  61  64  65  2e  0a  0a  20  20  20  20  20  20  be made...      
00002170:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  76  61                va
00002180:  72  20  6b  2c  20  76  2c  20  76  61  6c  75  65  20  3d  20  r k, v, value = 
00002190:  68  6f  6c  64  65  72  5b  6b  65  79  5d  3b  0a  20  20  20  holder[key];.   
000021a0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000021b0:  20  69  66  20  28  76  61  6c  75  65  20  26  26  20  74  79   if (value &amp;&amp; ty
000021c0:  70  65  6f  66  20  76  61  6c  75  65  20  3d  3d  3d  20  27  peof value === &#39;
000021d0:  6f  62  6a  65  63  74  27  29  20  7b  0a  20  20  20  20  20  object&#39;) {.     
000021e0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000021f0:  20  20  20  66  6f  72  20  28  6b  20  69  6e  20  76  61  6c     for (k in val
00002200:  75  65  29  20  7b  0a  20  20  20  20  20  20  20  20  20  20  ue) {.          
00002210:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00002220:  20  20  69  66  20  28  4f  62  6a  65  63  74  2e  68  61  73    if (Object.has
00002230:  4f  77  6e  50  72  6f  70  65  72  74  79  2e  63  61  6c  6c  OwnProperty.call
00002240:  28  76  61  6c  75  65  2c  20  6b  29  29  20  7b  0a  20  20  (value, k)) {.  
00002250:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00002260:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  76  20                v 
00002270:  3d  20  77  61  6c  6b  28  76  61  6c  75  65  2c  20  6b  29  = walk(value, k)
00002280:  3b  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  ;.              
00002290:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000022a0:  20  20  69  66  20  28  76  20  21  3d  3d  20  75  6e  64  65    if (v !== unde
000022b0:  66  69  6e  65  64  29  20  7b  0a  20  20  20  20  20  20  20  fined) {.       
000022c0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000022d0:  20  20  20  20  20  20  20  20  20  20  20  20  20  76  61  6c               val
000022e0:  75  65  5b  6b  5d  20  3d  20  76  3b  0a  20  20  20  20  20  ue[k] = v;.     
000022f0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00002300:  20  20  20  20  20  20  20  20  20  20  20  7d  20  65  6c  73             } els
00002310:  65  20  7b  0a  20  20  20  20  20  20  20  20  20  20  20  20  e {.            
00002320:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00002330:  20  20  20  20  20  20  20  20  64  65  6c  65  74  65  20  76          delete v
00002340:  61  6c  75  65  5b  6b  5d  3b  0a  20  20  20  20  20  20  20  alue[k];.       
00002350:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00002360:  20  20  20  20  20  20  20  20  20  7d  0a  20  20  20  20  20           }.     
00002370:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00002380:  20  20  20  20  20  20  20  7d  0a  20  20  20  20  20  20  20         }.       
00002390:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000023a0:  20  7d  0a  20  20  20  20  20  20  20  20  20  20  20  20  20   }.             
000023b0:  20  20  20  20  20  20  20  7d  0a  20  20  20  20  20  20  20         }.       
000023c0:  20  20  20  20  20  20  20  20  20  20  20  20  20  72  65  74               ret
000023d0:  75  72  6e  20  72  65  76  69  76  65  72  2e  63  61  6c  6c  urn reviver.call
000023e0:  28  68  6f  6c  64  65  72  2c  20  6b  65  79  2c  20  76  61  (holder, key, va
000023f0:  6c  75  65  29  3b  0a  20  20  20  20  20  20  20  20  20  20  lue);.          
00002400:  20  20  20  20  20  20  7d  0a  0a  0a  20  20  20  20  2f  2f        }...    //
00002410:  20  50  61  72  73  69  6e  67  20  68  61  70  70  65  6e  73   Parsing happens
00002420:  20  69  6e  20  66  6f  75  72  20  73  74  61  67  65  73  2e   in four stages.
00002430:  20  49  6e  20  74  68  65  20  66  69  72  73  74  20  73  74   In the first st
00002440:  61  67  65  2c  20  77  65  20  72  65  70  6c  61  63  65  20  age, we replace 
00002450:  63  65  72  74  61  69  6e  0a  20  20  20  20  2f  2f  20  55  certain.    // U
00002460:  6e  69  63  6f  64  65  20  63  68  61  72  61  63  74  65  72  nicode character
00002470:  73  20  77  69  74  68  20  65  73  63  61  70  65  20  73  65  s with escape se
00002480:  71  75  65  6e  63  65  73  2e  20  4a  61  76  61  53  63  72  quences. JavaScr
00002490:  69  70  74  20  68  61  6e  64  6c  65  73  20  6d  61  6e  79  ipt handles many
000024a0:  20  63  68  61  72  61  63  74  65  72  73  0a  20  20  20  20   characters.    
000024b0:  2f  2f  20  69  6e  63  6f  72  72  65  63  74  6c  79  2c  20  // incorrectly, 
000024c0:  65  69  74  68  65  72  20  73  69  6c  65  6e  74  6c  79  20  either silently 
000024d0:  64  65  6c  65  74  69  6e  67  20  74  68  65  6d  2c  20  6f  deleting them, o
000024e0:  72  20  74  72  65  61  74  69  6e  67  20  74  68  65  6d  20  r treating them 
000024f0:  61  73  20  6c  69  6e  65  20  65  6e  64  69  6e  67  73  2e  as line endings.
00002500:  0a  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  ..              
00002510:  20  20  63  78  2e  6c  61  73  74  49  6e  64  65  78  20  3d    cx.lastIndex =
00002520:  20  30  3b  0a  20  20  20  20  20  20  20  20  20  20  20  20   0;.            
00002530:  20  20  20  20  69  66  20  28  63  78  2e  74  65  73  74  28      if (cx.test(
00002540:  74  65  78  74  29  29  20  7b  0a  20  20  20  20  20  20  20  text)) {.       
00002550:  20  20  20  20  20  20  20  20  20  20  20  20  20  74  65  78               tex
00002560:  74  20  3d  20  74  65  78  74  2e  72  65  70  6c  61  63  65  t = text.replace
00002570:  28  63  78  2c  20  66  75  6e  63  74  69  6f  6e  20  28  61  (cx, function (a
00002580:  29  20  7b  0a  20  20  20  20  20  20  20  20  20  20  20  20  ) {.            
00002590:  20  20  20  20  20  20  20  20  20  20  20  20  72  65  74  75              retu
000025a0:  72  6e  20  27  5c  5c  75  27  20  2b  0a  20  20  20  20  20  rn &#39;\\u&#39; +.     
000025b0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
000025c0:  20  20  20  20  20  20  20  28  27  30  30  30  30  27  20  2b         (&#39;0000&#39; +
000025d0:  20  61  2e  63  68  61  72  43  6f  64  65  41  74  28  30  29   a.charCodeAt(0)
000025e0:  2e  74  6f  53  74  72  69  6e  67  28  31  36  29  29  2e  73  .toString(16)).s
000025f0:  6c  69  63  65  28  2d  34  29  3b  0a  20  20  20  20  20  20  lice(-4);.      
00002600:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  7d  29                })
00002610:  3b  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  ;.              
00002620:  20  20  7d  0a  0a  20  20  20  20  2f  2f  20  49  6e  20  74    }..    // In t
00002630:  68  65  20  73  65  63  6f  6e  64  20  73  74  61  67  65  2c  he second stage,
00002640:  20  77  65  20  72  75  6e  20  74  68  65  20  74  65  78  74   we run the text
00002650:  20  61  67  61  69  6e  73  74  20  72  65  67  75  6c  61  72   against regular
00002660:  20  65  78  70  72  65  73  73  69  6f  6e  73  20  74  68  61   expressions tha
00002670:  74  20  6c  6f  6f  6b  0a  20  20  20  20  2f  2f  20  66  6f  t look.    // fo
00002680:  72  20  6e  6f  6e  2d  4a  53  4f  4e  20  70  61  74  74  65  r non-JSON patte
00002690:  72  6e  73  2e  20  57  65  20  61  72  65  20  65  73  70  65  rns. We are espe
000026a0:  63  69  61  6c  6c  79  20  63  6f  6e  63  65  72  6e  65  64  cially concerned
000026b0:  20  77  69  74  68  20  27  28  29  27  20  61  6e  64  20  27   with &#39;()&#39; and &#39;
000026c0:  6e  65  77  27  0a  20  20  20  20  2f  2f  20  62  65  63  61  new&#39;.    // beca
000026d0:  75  73  65  20  74  68  65  79  20  63  61  6e  20  63  61  75  use they can cau
000026e0:  73  65  20  69  6e  76  6f  63  61  74  69  6f  6e  2c  20  61  se invocation, a
000026f0:  6e  64  20  27  3d  27  20  62  65  63  61  75  73  65  20  69  nd &#39;=&#39; because i
00002700:  74  20  63  61  6e  20  63  61  75  73  65  20  6d  75  74  61  t can cause muta
00002710:  74  69  6f  6e  2e  0a  20  20  20  20  2f  2f  20  42  75  74  tion..    // But
00002720:  20  6a  75  73  74  20  74  6f  20  62  65  20  73  61  66  65   just to be safe
00002730:  2c  20  77  65  20  77  61  6e  74  20  74  6f  20  72  65  6a  , we want to rej
00002740:  65  63  74  20  61  6c  6c  20  75  6e  65  78  70  65  63  74  ect all unexpect
00002750:  65  64  20  66  6f  72  6d  73  2e  0a  0a  20  20  20  20  2f  ed forms...    /
00002760:  2f  20  57  65  20  73  70  6c  69  74  20  74  68  65  20  73  / We split the s
00002770:  65  63  6f  6e  64  20  73  74  61  67  65  20  69  6e  74  6f  econd stage into
00002780:  20  34  20  72  65  67  65  78  70  20  6f  70  65  72  61  74   4 regexp operat
00002790:  69  6f  6e  73  20  69  6e  20  6f  72  64  65  72  20  74  6f  ions in order to
000027a0:  20  77  6f  72  6b  20  61  72  6f  75  6e  64  0a  20  20  20   work around.   
000027b0:  20  2f  2f  20  63  72  69  70  70  6c  69  6e  67  20  69  6e   // crippling in
000027c0:  65  66  66  69  63  69  65  6e  63  69  65  73  20  69  6e  20  efficiencies in 
000027d0:  49  45  27  73  20  61  6e  64  20  53  61  66  61  72  69  27  IE&#39;s and Safari&#39;
000027e0:  73  20  72  65  67  65  78  70  20  65  6e  67  69  6e  65  73  s regexp engines
000027f0:  2e  20  46  69  72  73  74  20  77  65  0a  20  20  20  20  2f  . First we.    /
00002800:  2f  20  72  65  70  6c  61  63  65  20  74  68  65  20  4a  53  / replace the JS
00002810:  4f  4e  20  62  61  63  6b  73  6c  61  73  68  20  70  61  69  ON backslash pai
00002820:  72  73  20  77  69  74  68  20  27  40  27  20  28  61  20  6e  rs with &#39;@&#39; (a n
00002830:  6f  6e  2d  4a  53  4f  4e  20  63  68  61  72  61  63  74  65  on-JSON characte
00002840:  72  29  2e  20  53  65  63  6f  6e  64  2c  20  77  65  0a  20  r). Second, we. 
00002850:  20  20  20  2f  2f  20  72  65  70  6c  61  63  65  20  61  6c     // replace al
00002860:  6c  20  73  69  6d  70  6c  65  20  76  61  6c  75  65  20  74  l simple value t
00002870:  6f  6b  65  6e  73  20  77  69  74  68  20  27  5d  27  20  63  okens with &#39;]&#39; c
00002880:  68  61  72  61  63  74  65  72  73  2e  20  54  68  69  72  64  haracters. Third
00002890:  2c  20  77  65  20  64  65  6c  65  74  65  20  61  6c  6c  0a  , we delete all.
000028a0:  20  20  20  20  2f  2f  20  6f  70  65  6e  20  62  72  61  63      // open brac
000028b0:  6b  65  74  73  20  74  68  61  74  20  66  6f  6c  6c  6f  77  kets that follow
000028c0:  20  61  20  63  6f  6c  6f  6e  20  6f  72  20  63  6f  6d  6d   a colon or comm
000028d0:  61  20  6f  72  20  74  68  61  74  20  62  65  67  69  6e  20  a or that begin 
000028e0:  74  68  65  20  74  65  78  74  2e  20  46  69  6e  61  6c  6c  the text. Finall
000028f0:  79  2c  0a  20  20  20  20  2f  2f  20  77  65  20  6c  6f  6f  y,.    // we loo
00002900:  6b  20  74  6f  20  73  65  65  20  74  68  61  74  20  74  68  k to see that th
00002910:  65  20  72  65  6d  61  69  6e  69  6e  67  20  63  68  61  72  e remaining char
00002920:  61  63  74  65  72  73  20  61  72  65  20  6f  6e  6c  79  20  acters are only 
00002930:  77  68  69  74  65  73  70  61  63  65  20  6f  72  20  27  5d  whitespace or &#39;]
00002940:  27  20  6f  72  0a  20  20  20  20  2f  2f  20  27  2c  27  20  &#39; or.    // &#39;,&#39; 
00002950:  6f  72  20  27  3a  27  20  6f  72  20  27  7b  27  20  6f  72  or &#39;:&#39; or &#39;{&#39; or
00002960:  20  27  7d  27  2e  20  49  66  20  74  68  61  74  20  69  73   &#39;}&#39;. If that is
00002970:  20  73  6f  2c  20  74  68  65  6e  20  74  68  65  20  74  65   so, then the te
00002980:  78  74  20  69  73  20  73  61  66  65  20  66  6f  72  20  65  xt is safe for e
00002990:  76  61  6c  2e  0a  0a  20  20  20  20  20  20  20  20  20  20  val...          
000029a0:  20  20  20  20  20  20  69  66  20  28  2f  5e  5b  5c  5d  2c        if (/^[\],
000029b0:  3a  7b  7d  5c  73  5d  2a  24  2f  2e  0a  20  20  20  20  74  :{}\s]*$/..    t
000029c0:  65  73  74  28  74  65  78  74  2e  72  65  70  6c  61  63  65  est(text.replace
000029d0:  28  2f  5c  5c  28  3f  3a  5b  22  5c  5c  5c  2f  62  66  6e  (/\\(?:[&quot;\\\/bfn
000029e0:  72  74  5d  7c  75  5b  30  2d  39  61  2d  66  41  2d  46  5d  rt]|u[0-9a-fA-F]
000029f0:  7b  34  7d  29  2f  67  2c  20  27  40  27  29  2e  0a  20  20  {4})/g, &#39;@&#39;)..  
00002a00:  20  20  72  65  70  6c  61  63  65  28  2f  22  5b  5e  22  5c    replace(/&quot;[^&quot;\
00002a10:  5c  5c  6e  5c  72  5d  2a  22  7c  74  72  75  65  7c  66  61  \\n\r]*&quot;|true|fa
00002a20:  6c  73  65  7c  6e  75  6c  6c  7c  2d  3f  5c  64  2b  28  3f  lse|null|-?\d+(?
00002a30:  3a  5c  2e  5c  64  2a  29  3f  28  3f  3a  5b  65  45  5d  5b  :\.\d*)?(?:[eE][
00002a40:  2b  5c  2d  5d  3f  5c  64  2b  29  3f  2f  67  2c  20  27  5d  +\-]?\d+)?/g, &#39;]
00002a50:  27  29  2e  0a  20  20  20  20  72  65  70  6c  61  63  65  28  &#39;)..    replace(
00002a60:  2f  28  3f  3a  5e  7c  3a  7c  2c  29  28  3f  3a  5c  73  2a  /(?:^|:|,)(?:\s*
00002a70:  5c  5b  29  2b  2f  67  2c  20  27  27  29  29  29  20  7b  0a  \[)+/g, &#39;&#39;))) {.
00002a80:  0a  20  20  20  20  2f  2f  20  49  6e  20  74  68  65  20  74  .    // In the t
00002a90:  68  69  72  64  20  73  74  61  67  65  20  77  65  20  75  73  hird stage we us
00002aa0:  65  20  74  68  65  20  65  76  61  6c  20  66  75  6e  63  74  e the eval funct
00002ab0:  69  6f  6e  20  74  6f  20  63  6f  6d  70  69  6c  65  20  74  ion to compile t
00002ac0:  68  65  20  74  65  78  74  20  69  6e  74  6f  20  61  0a  20  he text into a. 
00002ad0:  20  20  20  2f  2f  20  4a  61  76  61  53  63  72  69  70  74     // JavaScript
00002ae0:  20  73  74  72  75  63  74  75  72  65  2e  20  54  68  65  20   structure. The 
00002af0:  27  7b  27  20  6f  70  65  72  61  74  6f  72  20  69  73  20  &#39;{&#39; operator is 
00002b00:  73  75  62  6a  65  63  74  20  74  6f  20  61  20  73  79  6e  subject to a syn
00002b10:  74  61  63  74  69  63  20  61  6d  62  69  67  75  69  74  79  tactic ambiguity
00002b20:  0a  20  20  20  20  2f  2f  20  69  6e  20  4a  61  76  61  53  .    // in JavaS
00002b30:  63  72  69  70  74  3a  20  69  74  20  63  61  6e  20  62  65  cript: it can be
00002b40:  67  69  6e  20  61  20  62  6c  6f  63  6b  20  6f  72  20  61  gin a block or a
00002b50:  6e  20  6f  62  6a  65  63  74  20  6c  69  74  65  72  61  6c  n object literal
00002b60:  2e  20  57  65  20  77  72  61  70  20  74  68  65  20  74  65  . We wrap the te
00002b70:  78  74  0a  20  20  20  20  2f  2f  20  69  6e  20  70  61  72  xt.    // in par
00002b80:  65  6e  73  20  74  6f  20  65  6c  69  6d  69  6e  61  74  65  ens to eliminate
00002b90:  20  74  68  65  20  61  6d  62  69  67  75  69  74  79  2e  0a   the ambiguity..
00002ba0:  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  .               
00002bb0:  20  20  20  20  20  6a  20  3d  20  65  76  61  6c  28  27  28       j = eval(&#39;(
00002bc0:  27  20  2b  20  74  65  78  74  20  2b  20  27  29  27  29  3b  &#39; + text + &#39;)&#39;);
00002bd0:  0a  0a  20  20  20  20  2f  2f  20  49  6e  20  74  68  65  20  ..    // In the 
00002be0:  6f  70  74  69  6f  6e  61  6c  20  66  6f  75  72  74  68  20  optional fourth 
00002bf0:  73  74  61  67  65  2c  20  77  65  20  72  65  63  75  72  73  stage, we recurs
00002c00:  69  76  65  6c  79  20  77  61  6c  6b  20  74  68  65  20  6e  ively walk the n
00002c10:  65  77  20  73  74  72  75  63  74  75  72  65  2c  20  70  61  ew structure, pa
00002c20:  73  73  69  6e  67  0a  20  20  20  20  2f  2f  20  65  61  63  ssing.    // eac
00002c30:  68  20  6e  61  6d  65  2f  76  61  6c  75  65  20  70  61  69  h name/value pai
00002c40:  72  20  74  6f  20  61  20  72  65  76  69  76  65  72  20  66  r to a reviver f
00002c50:  75  6e  63  74  69  6f  6e  20  66  6f  72  20  70  6f  73  73  unction for poss
00002c60:  69  62  6c  65  20  74  72  61  6e  73  66  6f  72  6d  61  74  ible transformat
00002c70:  69  6f  6e  2e  0a  0a  20  20  20  20  20  20  20  20  20  20  ion...          
00002c80:  20  20  20  20  20  20  20  20  20  20  72  65  74  75  72  6e            return
00002c90:  20  74  79  70  65  6f  66  20  72  65  76  69  76  65  72  20   typeof reviver 
00002ca0:  3d  3d  3d  20  27  66  75  6e  63  74  69  6f  6e  27  20  3f  === &#39;function&#39; ?
00002cb0:  0a  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  .               
00002cc0:  20  20  20  20  20  20  20  20  20  77  61  6c  6b  28  7b  27           walk({&#39;
00002cd0:  27  3a  20  6a  7d  2c  20  27  27  29  20  3a  20  6a  3b  0a  &#39;: j}, &#39;&#39;) : j;.
00002ce0:  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20                  
00002cf0:  7d  0a  0a  20  20  20  20  2f  2f  20  49  66  20  74  68  65  }..    // If the
00002d00:  20  74  65  78  74  20  69  73  20  6e  6f  74  20  4a  53  4f   text is not JSO
00002d10:  4e  20  70  61  72  73  65  61  62  6c  65  2c  20  74  68  65  N parseable, the
00002d20:  6e  20  61  20  53  79  6e  74  61  78  45  72  72  6f  72  20  n a SyntaxError 
00002d30:  69  73  20  74  68  72  6f  77  6e  2e  0a  0a  20  20  20  20  is thrown...    
00002d40:  20  20  20  20  20  20  20  20  20  20  20  20  74  68  72  6f              thro
00002d50:  77  20  6e  65  77  20  53  79  6e  74  61  78  45  72  72  6f  w new SyntaxErro
00002d60:  72  28  27  4a  53  4f  4e  2e  70  61  72  73  65  27  29  3b  r(&#39;JSON.parse&#39;);
00002d70:  0a  20  20  20  20  20  20  20  20  20  20  20  20  7d  3b  0a  .            };.
00002d80:  20  20  20  20  20  20  20  20  7d  0a  20  20  20  20  7d  29          }.    })
00002d90:  28  29  3b  0a  20  20  20  20  24  2e  74  6f  4a  53  4f  4e  ();.    $.toJSON
00002da0:  20  3d  20  66  75  6e  63  74  69  6f  6e  28  74  65  78  74   = function(text
00002db0:  2c  20  72  65  76  69  76  65  72  29  20  7b  0a  20  20  20  , reviver) {.   
00002dc0:  20  20  20  20  20  69  66  20  28  74  79  70  65  6f  66  20       if (typeof 
00002dd0:  72  65  76  69  76  65  72  20  3d  3d  20  22  75  6e  64  65  reviver == &quot;unde
00002de0:  66  69  6e  65  64  22  29  20  7b  0a  20  20  20  20  20  20  fined&quot;) {.      
00002df0:  20  20  20  20  20  20  72  65  76  69  76  65  72  20  3d  20        reviver = 
00002e00:  6e  75  6c  6c  3b  0a  20  20  20  20  20  20  20  20  7d  0a  null;.        }.
00002e10:  20  20  20  20  20  20  20  20  72  65  74  75  72  6e  20  4a          return J
00002e20:  53  4f  4e  2e  70  61  72  73  65  28  74  65  78  74  2c  20  SON.parse(text, 
00002e30:  72  65  76  69  76  65  72  29  3b  0a  20  20  20  20  7d  3b  reviver);.    };
00002e40:  0a  20  20  20  20  24  2e  6a  53  4f  4e  54  6f  53  74  72  .    $.jSONToStr
00002e50:  69  6e  67  20  3d  20  66  75  6e  63  74  69  6f  6e  28  76  ing = function(v
00002e60:  61  6c  75  65  2c  20  72  65  70  6c  61  63  65  72  2c  20  alue, replacer, 
00002e70:  73  70  61  63  65  29  20  7b  0a  20  20  20  20  20  20  20  space) {.       
00002e80:  20  69  66  20  28  74  79  70  65  6f  66  20  72  65  70  6c   if (typeof repl
00002e90:  61  63  65  72  20  3d  3d  20  22  75  6e  64  65  66  69  6e  acer == &quot;undefin
00002ea0:  65  64  22  29  20  7b  0a  20  20  20  20  20  20  20  20  20  ed&quot;) {.         
00002eb0:  20  20  20  72  65  70  6c  61  63  65  72  20  3d  20  6e  75     replacer = nu
00002ec0:  6c  6c  3b  0a  20  20  20  20  20  20  20  20  7d  0a  20  20  ll;.        }.  
00002ed0:  20  20  20  20  20  20  69  66  20  28  74  79  70  65  6f  66        if (typeof
00002ee0:  20  73  70  61  63  65  20  3d  3d  20  22  75  6e  64  65  66   space == &quot;undef
00002ef0:  69  6e  65  64  22  29  20  7b  0a  20  20  20  20  20  20  20  ined&quot;) {.       
00002f00:  20  20  20  20  20  73  70  61  63  65  20  3d  20  6e  75  6c       space = nul
00002f10:  6c  3b  0a  20  20  20  20  20  20  20  20  7d  0a  20  20  20  l;.        }.   
00002f20:  20  20  20  20  20  72  65  74  75  72  6e  20  4a  53  4f  4e       return JSON
00002f30:  2e  73  74  72  69  6e  67  69  66  79  28  76  61  6c  75  65  .stringify(value
00002f40:  2c  20  72  65  70  6c  61  63  65  72  2c  20  73  70  61  63  , replacer, spac
00002f50:  65  29  3b  0a  20  20  20  20  7d  3b  0a  20  20  20  20  0a  e);.    };.    .
00002f60:  7d  29  28  6a  51  75  65  72  79  29  3b                      })(jQuery);
</pre><hr><pre></pre></table></body></html>